package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.List;

import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.Cliente;
import es.uned.etsii.si3.taller.FactoriaDAO;
import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.Vehiculo;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;

public class PTBuscarCliente extends ActionSupport {
	
	private static final long serialVersionUID = 1L;
	
	private 	String 			usuarioLogin;
	private 	String 			dni;
	private 	String 			nombre;
	private 	String 			apellidos;
	private 	String 			poblacion;
	private 	String 			direccion;
	private 	int 			codigoPostal;
	private 	String 			telefono;		

	public 		String    		getUsuarioLogin() 						{ return this.usuarioLogin; }
	public 		String    		getNombre()       						{ return this.nombre; }
	public 		String    		getApellidos()    						{ return this.apellidos; }
	public 		String    		getDni()          						{ return this.dni; }
	public 		String    		getPoblacion()    						{ return this.poblacion; }
	public 		String    		getDireccion()    						{ return this.direccion; }
	public 		int       		getCodigoPostal() 						{ return this.codigoPostal; }
	public 		String    		getTelefono()     						{ return this.telefono; }	

	public 		void 			setUsuarioLogin(String s) 				{ this.usuarioLogin = s; }
	public 		void 			setNombre(String s) 					{ this.nombre = s; }
	public 		void 			setApellidos(String s) 					{ this.apellidos = s; }
	public 		void 			setDni(String s) 						{ this.dni = s; }
	public 		void 			setPoblacion(String s) 					{ this.poblacion = s; }
	public 		void 			setDireccion(String s) 					{ this.direccion = s; }
	public 		void 			setCodigoPostal(int i) 					{ this.codigoPostal = i; }
	public 		void 			setTelefono(String s) 					{ this.telefono = s; }	

	private 	static Cliente 	clienteSeleccionado;
	public 		static Cliente 	getClienteSeleccionado() 				{ return PTBuscarCliente.clienteSeleccionado; }
	public 		static void     setClienteSeleccionado(Cliente c) 		{ PTBuscarCliente.clienteSeleccionado = c; }

	private 	static int		clienteSeleccionadoID = -1;
	public 		static int		getClienteSeleccionadoID() 				{ return PTBuscarCliente.clienteSeleccionadoID; }
	public 		static void	 	setClienteSeleccionadoID(int i) 		{ PTBuscarCliente.clienteSeleccionadoID = i; }
	
	private 	Vehiculo  		vehiculoSeleccionado;
	public 		Vehiculo 	 	getVehiculoSeleccionado() 				{ return this.vehiculoSeleccionado; }
	public 		void      		setVehiculoSeleccionado(Vehiculo v)		{ this.vehiculoSeleccionado = v; }

	private 	static int		vehiculoSeleccionadoID = -1;
	public 		int 			getVehiculoSeleccionadoID() 			{ return PTBuscarCliente.vehiculoSeleccionadoID; }
	public 		void			setVehiculoSeleccionadoID(int i) 		{ PTBuscarCliente.vehiculoSeleccionadoID = i; }

	private Where<Cliente, Integer> whereClienteQb;
	
	/**
	 * Limpia los datos del cliente
	 * @return  actionerror
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_NUEVO_PARTE_ENTRADA)	
	public String pTLimpiarCliente() {
		PTBuscarCliente.setClienteSeleccionado(null);
		PTBuscarCliente.setClienteSeleccionadoID(-1);
		this.setUsuarioLogin(null);
		this.setDni(null);
		this.setNombre(null);
		this.setApellidos(null);		
		this.setPoblacion(null);
		this.setDireccion(null);
		this.setCodigoPostal(0);
		this.setTelefono(null);		
		return SUCCESS;
	}
	
	/**
	 * Permite buscar un cliente a partir de los datos introducidos
	 * @return  actionerror
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_NUEVO_PARTE_ENTRADA)	
	public String pTBuscarCliente() {
		String res = SUCCESS;		
		boolean yaEmpezado = false;
		this.setVehiculoSeleccionadoID(-1);
		try {			
			QueryBuilder<Cliente, Integer> lista = FactoriaDAO.getDao(Cliente.class).queryBuilder();			
			whereClienteQb = lista.where();
			yaEmpezado = addCondicionesCliente();
			if ( !yaEmpezado ) {
				addActionError("No se ha rellenado ningún campo por el que filtrar");
				res = ERROR;				
			} else {
				List<Cliente> listaCliente = whereClienteQb.query();
				if ( listaCliente.size() == 1 ) {
					Cliente c = listaCliente.get(0);
					PTBuscarCliente.setClienteSeleccionado(c);
					PTBuscarCliente.setClienteSeleccionadoID(c.getId());					
					cargarDatosCliente(c);
				} else {
					addActionError("Con esas condiciones no es posible encontrar un único cliente");
					res = ERROR;
				}
			}
		}
		catch (SQLException e) {
			addActionError("Error al buscar el cliente: " + e);
		}		
		return res;
	}
	

	private void cargarDatosCliente(Cliente c) {		
		this.setDni(c.getDni());
		this.setNombre(c.getNombre());
		this.setApellidos(c.getApellidos());
		this.setPoblacion(c.getPoblacion());
		this.setDireccion(c.getDireccion());
		this.setCodigoPostal(c.getCodigoPostal());
		this.setTelefono(c.getTelefono());
	}
	
	
	private boolean addCondicionesCliente() {
		boolean yaEmpezado = false;		 
		yaEmpezado = addCondicionCliente(Cliente.DNI_FIELD_NAME, this.getDni(), yaEmpezado);
		yaEmpezado = addCondicionCliente(Cliente.NOMBRE_FIELD_NAME, this.getNombre(), yaEmpezado);
		yaEmpezado = addCondicionCliente(Cliente.APELLIDOS_FIELD_NAME, this.getApellidos(), yaEmpezado);
		yaEmpezado = addCondicionCliente(Cliente.POBLACION_FIELD_NAME, this.getPoblacion(), yaEmpezado);
		yaEmpezado = addCondicionCliente(Cliente.DIRECCION_FIELD_NAME, this.getDireccion(), yaEmpezado);
		yaEmpezado = addCondicionCliente(Cliente.CODIGOPOSTAL_FIELD_NAME, this.getCodigoPostal(), yaEmpezado);
		yaEmpezado = addCondicionCliente(Cliente.TELEFONO_FIELD_NAME, this.getTelefono(), yaEmpezado);
		return yaEmpezado;
	}

	private boolean addCondicionCliente(String campo, String valorCampo, boolean yaEmpezado) {
		boolean res = yaEmpezado;
		try {
			if ( !valorCampo.isEmpty() ) {				
				res = true;
				if ( yaEmpezado ) {
					whereClienteQb.and().eq(campo, valorCampo);
				} else {
					whereClienteQb.eq(campo, valorCampo);
				}
			}
		} catch (SQLException e) {
			addActionError("Error al buscar el cliente: " + e);
		}
		return res;
	}

	private boolean addCondicionCliente(String campo, int valorCampo, boolean yaEmpezado) {
		boolean res = yaEmpezado;
		try {
			if ( valorCampo > 0 ) {				
				res = true;
				if ( yaEmpezado ) {
					whereClienteQb.and().eq(campo, valorCampo);
				} else {
					whereClienteQb.eq(campo, valorCampo);
				}
			}
		} catch (SQLException e) {
			addActionError("Error al buscar el cliente: " + e);
		}
		return res;
	}

	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_NUEVO_PARTE_ENTRADA)	
	public String execute() { return SUCCESS; }
}
